.TITLE DRRES .IDENT /07.01/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; MODIFIED FOR RSX-11M-PLUS VERSION 2 BY: ; ; M. S. FOX ; J. M. LAWLER ; T. M. MARTIN ; B. S. MCCARTHY ; ; MODIFIED BY: ; ; J. R. KAUFFMAN 7-MAR-83 7.1 ; ; JRK277 -- CORRECT STACK DEPTH FOR ACP QUEUE REORDER ; ; MACRO LIBRARY CALLS ; .MCALL HDRDF$,PKTDF$,PCBDF$,TCBDF$ HDRDF$ ;DEFINE TASK HEADER OFFSETS PKTDF$ ;DEFINE I/O PACKET OFFSETS PCBDF$ ;DEFINE PARTITION CONTROL BLOCK OFFSETS TCBDF$ ;DEFINE TASK CONTROL BLOCK OFFSETS ;+ ; **-$DRUNS-UNSTOP TASK ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO UNSTOP A TASK THAT HAS STOPPED ; ITSELF VIA A STOP DIRECTIVE OR A RECEIVE OR STOP DIRECTIVE. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(133.),DPB SIZE(3.). ; WD. 01 -- FIRST HALF OF TASK NAME. ; WD. 02 -- SECOND HALF OF TASK NAME. ; ; INPUTS: ; ; R0=ADDRESS OF THE TCB OF THE TASK TO BE UNSTOPPED. ; R1=ADDRESS OF THE TASK STATUS WORD OF THE TASK TO BE UNSTOPPED. ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF THE SPECIFIED ; TASK IS NOT ACTIVE. ; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF THE SPECIFIED ; TASK IS NOT STOPPED, OR STOPPED FOR EVENT ; FLAG(S) OR BUFFERED I/O. ;- .ENABL LSB $DRUNS::TST (R1)+ ;SPECIFIED TASK ACTIVE? BMI 20$ ;IF MI NO BIT #T2.SEF,(R1) ;TASK STOPPED FOR EVENT FLAG BNE 30$ ;IF NE YES MOV #T2.STP,R2 ;PICK UP STOP BIT BR 5$ ;JOIN COMMON CODE WITH RESUME ;+ ; **-$DRRES-RESUME TASK EXECUTION ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO RESUME THE EXECUTION OF A TASK THAT ; HAS ISSUED A SUSPEND DIRECTIVE. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(47.),DPB SIZE(3.). ; WD. 01 -- FIRST HALF OF TASK NAME. ; WD. 02 -- SECOND HALF OF TASK NAME. ; ; INPUTS: ; ; R0=ADDRESS OF THE TCB OF THE TASK TO BE RESUMED. ; R1=ADDRESS OF THE TASK STATUS WORD OF THE TASK TO BE RESUMED. ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS7 IS RETURNED IF THE SPECIFIED ; TASK IS NOT ACTIVE. ; DIRECTIVE STATUS OF 'D.RS8' IS RETURNED IF THE SPECIFIED ; TASK IS NOT SUSPENDED. ;- $DRRES::TST (R1)+ ;TASK ACTIVE? BMI 20$ ;IF MI NO MOV #T2.SPN,R2 ;GET SUSPEND BIT 5$: BIT R2,(R1) ;TASK CURRENTLY SUSPENDED? BNE 10$ ;IF NE YES TST (R1) ;AST IN PROGRESS? BPL 30$ ;IF PL NO ASL R2 ;SET PRE AST SUSPEND BIT BIT R2,(R1) ;WAS TASK SUSPENDED? BEQ 30$ ;IF EQ NO 10$: CMPB $DICSV,#133. ;IS THIS AN UNSTOP DIRECTIVE? BEQ 15$ ;IF EQ YES BIC R2,(R1) ;CLEAR TASK'S SUSPEND BIT CALLR $SETCR ;SET A CONDITIONAL SCHEDULE REQUEST 15$: CALLR $EXRQN ;UNSTOP SPECIFIED TASK 20$: DRSTS D.RS7 ;SET DIRECTIVE STATUS 30$: DRSTS D.RS8 ;SET DIRECTIVE STATUS ;+ ; **-$DRSTP-STOP TASK ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO STOP THE ISSUING TASK. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(131.),DPB SIZE(1.). ; ; INPUTS: ; ; R2=ADDRESS OF THE SECOND TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF 'D.RS22' IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS80' IS RETURNED IF THE ISSUING ; TASK IS AT AST STATE. ;- $DRSTP::TST (R2) ;IS ISSUING TASK AT AST STATE? BMI 35$ ;IF MI YES CALL $STPCT ;STOP ISSUING TASK DRSTS D.RS22 ;RETURN SUCCESS WITH +2 35$: DRSTS D.RS80 ;ISSUING TASK IS AT AST STATE ;+ ; **-$DRSPN-SUSPEND EXECUTION ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO SUSPEND THE EXECUTION OF THE ISSUING ; TASK. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(45.),DPB SIZE(1.). ; ; INPUTS: ; ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE LAST WORD IN THE DPB+2. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 WITH A DIRECTIVE STATUS OF 'D.RS22'. ;- $DRSPN::BIS #T2.SPN,(R2) ;SUSPEND CURRENT TASK CALL $SETRT ;FORCE A REDISPATCHING OF PROCESSOR DRSTS D.RS22 ;SET DIRECTIVE STATUS ;+ ; **-$DRATP-ALTER TASK PRIORITY ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CHANGE THE TASK PRIORITY ; OF THE SPECIFIED TASK. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(9.),DPB SIZE(4.) ; WD. 01 -- FIRST HALF OF TASK NAME. ; WD. 02 -- SECOND HALF OF TASK NAME. ; WD. 03 -- NEW PRIORITY. ; ; INPUTS: ; ; R0=ADDRESS OF THE TCB OF THE TASK TO BE ALTERED. ; R1=ADDRESS OF THE TASK STATUS WORD OF THE TASK TO BE ALTERED. ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE LAST WORD IN THE DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS7' IS RETURNED IF THE ; TASK IS NOT ACTIVE. ; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF A ; NONPRIVILEGED TASK ATTEMPTS TO RAISE ; ITS PRIORITY ITS INSTALLED PRIORITY. ; DIRECTIVE STATUS OF 'D.RS17' IS RETURNED IF A ; TASK ATTEMPTS TO ALTER THE PRIORITY ; OF A CHECKPOINTED TASK WITH OUTSTANDING ; I/O. ; DIRECTIVE STATUS OF 'D.RS95' IS RETURNED IF THE ; NEW PRIORITY SPECIFIED IS INVALID. ; ;- $DRATP:: ;REF LABEL .IF DF M$$MUP BIT #T3.PRV,T.ST3(R5) ;ISSUING TASK PRIVILEGED? BNE 39$ ;IF NE YES CMP R0,R5 ;MODIFYING OWN PRIORITY? BNE 180$ ;IF NE NO, PRIVILEGE VIOLATION CMPB (R3),T.DPRI(R0) ;RAISING SELF ABOVE INSTALLED PRI? BLOS 39$ ;IF LOS NO 180$: DRSTS D.RS16 ;PRIVILEGE VIOLATION .IFTF 170$: DRSTS D.RS95 ;ILLEGAL PRIORITY 39$: ;REF LABEL .ENDC MOV R0,R5 ;SAVE TCB ADDR OF TASK TO BE ALTERED TST (R1) ;TASK ACTIVE? BMI 20$ ;IF MI NO MOV (R3),R3 ;GET NEW PRIORITY AND TEST IT BNE 40$ ;IF NE ONE WAS SPECIFIED BISB T.DPRI(R5),R3 ;USE DEFAULT PRIORITY 40$: CMP R3,#250. ;NEW PRIORITY .GT. 250? BHI 170$ ;IF HI YES MOVB R3,-(SP) ;SAVE NEW PRIORITY TSTB T.IOC(R5) ;ANY I/O ACTIVE? BEQ 100$ ;IF EQ NO MOV T.PCB(R5),R1 ;GET PCB ADDRESS OF TARGET TASK BIT #PS.OUT!PS.CKP,P.STAT(R1) ;TASK REGION CHECKPOINTED? BNE 190$ ;IF NE YES, RETURN IE.RSU ERROR CLR -(SP) ;PUSH INITIAL LUN NUMBER - 1 .IF DF X$$HDR 50$: MOV T.PCB(R5),R1 ;GET ADDRESS OF TASK'S PCB MOV P.HDR(R1),R4 ;GET HEADER ADDR BNE 60$ ;IF NE, RESIDENT HEADER (IN POOL) MOV P.REL(R1),KISAR6 ;OTHERWISE, MAP TASK HEADER MOV #140000,R4 ;GET HEADER ADDR 60$: ;REFERENCE LABEL .IFF 50$: MOV T.PCB(R5),R1 ;GET ADDRES OF TASK'S PCB MOV P.HDR(R1),R4 ;GET TASK HEADER ADDRESS .ENDC CMP (SP),H.NLUN(R4) ;PAST LAST LUN? BHIS 90$ ;IF HIS YES MOV (SP),R1 ;GET LUN -1 CALL $MPLNE ;MAP LUN TO UCB ADDRESS BCS 80$ ;IF CS LUN IS NOT ASSIGNED MOV R0,-(SP) ;SAVE UCB ADDRESS MOV U.SCB(R0),R4 ;GET PTR TO SCB FOR THIS UCB CALL 130$ ;REORDER I/O QUEUE MOV (SP),R0 ;RETRIEVE UCB ADDRESS TST U.CW1(R0) ;DEVICE MOUNTABLE? BPL 79$ ;IF PL NO BITB #US.MNT,U.STS(R0) ;MOUNTED? BNE 79$ ;IF NE NO MOV U.ACP(R0),R4 ;PICK UP TCB OF ACP BEQ 79$ ;IF EQ MOUNTED FOREIGN WITH NO ACP ADD #T.RCVL,R4 ;POINT TO RECEIVE QUEUE LISTHEAD CALL 130$ ;REORDER ACP QUEUE 79$: TST (SP)+ ;REMOVE UCB ADDRESS FROM STACK 80$: INC (SP) ;UPDATE LUN NUMBER BR 50$ ;CONTINUE THROUGH LUN LOOP 90$: TST (SP)+ ;POP LUN NUMBER FROM STACK 100$: ; .IF DF A$$CNT BIT #T2.ABO,T.ST2(R5) ;IS TASK ABORTED BNE 106$ ;IF NE YES MOV KISAR6,R0 ;SAVE MAPPING MOV T.ACN(R5),KISAR6 ;MAP ACCOUNTING BLOCK BEQ 105$ ;IF EQ NO ACCOUNTING CMPB #BT.TAB,@#B.TYP+140000 ;IS THIS A TAB BNE 105$ ;IF NE NO CMPB (SP),@#B.PRI+140000 ;IS NEW PRIORITY HIGHER THAN PREV BLOS 105$ ;IF LOS NO MOVB (SP),@#B.PRI+140000 ;RECORD NEW HIGHER PRIORITY 105$: MOV R0,KISAR6 ;RESTORE MAPPING 106$: ; .ENDC ;A$$CNT MOVB (SP)+,T.PRI(R5) ;SET NEW TASK PRIORITY MOV R5,R0 ;GET TCB ADDRESS OF TASK TO BE ALTERED CALL $ACTRM ;REMOVE TCB FROM ATL BCS 110$ ;IF CS TCB NOT YET IN ATL CALL $ACTTK ;RE-INSERT TCB IN ATL 110$: MOV T.PCB(R5),R1 ;POINT TO TASK PCB TST P.ATT(R1) ;TASK ATTACHED TO OWN REGION YET? BNE 115$ ;IF NE YES MOV R5,R0 ;COPY TCB POINTER CALL $ALTRG ;ALTER TASK REGION PRIORITY BR 129$ ; 115$: MOV T.ATT(R5),R4 ;POINT TO FIRST ENTRY IN ATTACH QUEUE 120$: TSTB A.MPCT-A.TCBL(R4) ;TASK MAPPED TO THIS REGION? BEQ 125$ ;IF EQ NO MOV R5,R0 ;COPY TCB POINTER MOV A.PCB-A.TCBL(R4),R1 ;POINT TO MAPPED PCB CALL $ALTRG ;ALTER REGION PRIORITY 125$: MOV (R4),R4 ;POINT TO NEXT ATTACHMENT DESCRIPTOR BNE 120$ ;IF NE THERE IS ONE 129$: CALLR $DRDSE ;DECLARE SIGNIFICANT EVENT 130$: MOV #-2,-(SP) ;CONSTRUCT TEMPORARY LISTHEAD ON STACK ADD SP,(SP) ; CLR -(SP) ; 140$: MOV R4,R0 ;GET I/O PACKET LISTHEAD ADDR MOV R5,R1 ;GET TCB ADDR OF TASK TO BE ALTERED CALL $QRMVT ;REMOVE I/O PACKET BY TCB ADDR BCS 150$ ;IF CS NO I/O PACKET FOUND CMPB I.PRI(R1),#250. ;PRIORITY HIGHER THAN 250? BHI 145$ ;IF HI YES, DON'T TOUCH MOVB 12(SP),I.PRI(R1) ;SET NEW PRIORITY 145$: MOV SP,R0 ;SET TEMPORARY LISTHEAD ADDRESS CALL $QINSF ;INSERT I/O PACKET IN TEMPORARY LIST BR 140$ ;CONTINUE THROUGH PACKET REMOVAL LOOP 150$: MOV SP,R0 ;SET TEMPORARY LISTHEAD ADDR CALL $QRMVF ;REMOVE FIRST I/O PACKET FROM LIST BCS 160$ ;IF CS NO I/O PACKET FOUND MOV R4,R0 ;GET I/O PACKET LISTHEAD ADDR CALL $QINSP ;RE-INSERT I/O PACKET BY NEW PRIORITY BR 150$ ;CONTINUE THROUGH PACKET INSERTION LOOP 160$: CMP (SP)+,(SP)+ ;CLEAN TEMPORARY LISTHEAD OFF STACK RETURN ; 190$: DRSTS D.RS17 ;RETURN IE.RSU ERROR .DSABL LSB .END